package cn.iocoder.yudao.module.im.api.group;

import cn.iocoder.yudao.module.im.api.group.dto.GroupDTO;
import cn.iocoder.yudao.module.im.api.group.dto.GroupCreateReqDTO;
import cn.iocoder.yudao.module.im.api.group.dto.GroupUpdateReqDTO;
import cn.iocoder.yudao.module.im.api.group.dto.GroupMemberDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static cn.iocoder.yudao.module.im.api.group.GroupApiConstants.*;

/**
 * 群组服务的 Feign 接口
 *
 * @author 芋道源码
 */
@FeignClient(value = GROUP_SERVICE, contextId = "group")
public interface GroupService {

    /**
     * 创建群组
     *
     * @param reqDTO 创建群组请求
     * @return 群组ID
     */
    @PostMapping(CREATE_GROUP)
    Long createGroup(@RequestBody GroupCreateReqDTO reqDTO);

    /**
     * 获取群组详情
     *
     * @param groupId 群组ID
     * @return 群组详情
     */
    @GetMapping(GET_GROUP)
    GroupDTO getGroup(@RequestParam("groupId") Long groupId);

    /**
     * 更新群组信息
     *
     * @param reqDTO 更新群组请求
     * @return 是否更新成功
     */
    @PutMapping(UPDATE_GROUP)
    Boolean updateGroup(@RequestBody GroupUpdateReqDTO reqDTO);

    /**
     * 解散群组
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否解散成功
     */
    @DeleteMapping(DISSOLVE_GROUP)
    Boolean dissolveGroup(@RequestParam("groupId") Long groupId, @RequestParam("userId") Long userId);

    /**
     * 查询创建者的群组列表
     *
     * @param creatorId 创建者ID
     * @return 群组列表
     */
    @GetMapping(LIST_GROUP_BY_CREATOR)
    List<GroupDTO> getGroupListByCreatorId(@RequestParam("creatorId") Long creatorId);

    /**
     * 加入群组
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否加入成功
     */
    @PostMapping(JOIN_GROUP)
    Boolean joinGroup(@RequestParam("groupId") Long groupId, @RequestParam("userId") Long userId);

    /**
     * 退出群组
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否退出成功
     */
    @PostMapping(EXIT_GROUP)
    Boolean exitGroup(@RequestParam("groupId") Long groupId, @RequestParam("userId") Long userId);

    /**
     * 踢出群组成员
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param operatorId 操作者ID
     * @return 是否踢出成功
     */
    @DeleteMapping(KICK_MEMBER)
    Boolean kickMember(@RequestParam("groupId") Long groupId, @RequestParam("userId") Long userId, 
                      @RequestParam("operatorId") Long operatorId);

    /**
     * 设置群成员身份
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param memberType 成员类型
     * @param operatorId 操作者ID
     * @return 是否设置成功
     */
    @PutMapping(SET_MEMBER_TYPE)
    Boolean setMemberType(@RequestParam("groupId") Long groupId, @RequestParam("userId") Long userId, 
                         @RequestParam("memberType") Integer memberType, @RequestParam("operatorId") Long operatorId);

    /**
     * 发布群公告
     *
     * @param groupId 群组ID
     * @param title 公告标题
     * @param content 公告内容
     * @param publisherId 发布者ID
     * @return 公告ID
     */
    @PostMapping(PUBLISH_ANNOUNCEMENT)
    Long publishAnnouncement(@RequestParam("groupId") Long groupId, @RequestParam("title") String title, 
                           @RequestParam("content") String content, @RequestParam("publisherId") Long publisherId);

    /**
     * 获取群成员列表
     *
     * @param groupId 群组ID
     * @return 群成员列表
     */
    @GetMapping(LIST_GROUP_MEMBERS)
    List<GroupMemberDTO> getGroupMembers(@RequestParam("groupId") Long groupId);

}